<?php
/**
 * Created by PhpStorm.
 * User: yuanjie
 * Date: 15/10/28
 * Time: 下午2:30
 */
class OrderProductNonStandard extends Eloquent
{
    protected $table = "order_product_non_standard";


    /**
     * @Author:      lyt
     * @DateTime:    2016-01-28 16:18:49
     * @Description: 用于修改 非标产品的 产品数量
     *  逻辑规则如下
     * 没有出库记录的  修改随意修改数量 null
     * 备货中 不能修改数量 需要领料 后在操作 0
     * 等待领料的  不能修改数量  需要领料 后在操作 1
     * 已经领料的  修改的数量  如果存在进行中的退库的不能修改数量  没有退库的 添加数量 的 生成新的 出库申请 如果 减少数量  退库成功 修改数量 2
     * 都是已经退货的 可以修改数量 3
     * 都是已经删除的 可以修改数量 4
     */
    public static function changeProductItemNum($order_id,$opns_old,$number,$amount,$sc_user_id){
    	return DB::transaction(function () use ($order_id,$opns_old,$number,$amount,$sc_user_id) {
    	    $opns=OrderProductNonStandard::find($opns_old->id);
            $temp_op_amount=$opns->amount;
            $order=Orders::find($order_id);
            $temp_num=$number-$opns->num;            
            if($temp_num!=0){//说明调整数量了 才走库存相关判断
                $moo=MaintenanceOutOrder::where("product_type","non_standard")->where("product_item_id",$opns->id)->whereIn("status",array(0,1))->first();
                if($moo){//如果存在 备货中或者 等待领料的 出库申请  不允许修改
                    return Lang::get("scs_error.order_product_item_change_error_40012");
                }
                $mro=MaintenanceReturnOrder::where("product_type","non_standard")->where("product_item_id",$opns->id)->where("status",0)->first();
                if($mro){//如果 存在 正在退库的 不允许修改
                    return Lang::get("scs_error.order_product_item_return_error_40013");
                }
            }            
            $temp_moo=MaintenanceOutOrder::where("product_type","non_standard")->where("product_item_id",$opns->id)->where("status",2)->first();
            
            $temp_amount=$temp_num*$opns->amount;
            if($temp_moo){//如果存在已经领料的   该种情况 如果是数量增加 添加新的 出库申请  如果是减少  判断 领料 和退库数量 的差值 进行修改                
                if($temp_num>0){//如果是数量增加
                    if($temp_op_amount!=$amount){//非标耗材的时候价格因素起作用 
                        if($opns->type==0&&PriceBargaining::ischange($opns->item_id,$order->shop_id)==0){//如果标准耗材且 不能改价格的 该判断
                            return Lang::get("scs_error.order_price_error_400137");
                        }else{
                            $max=MaintenanceStorageItem::where('item_id',$opns->item_id)->where('shop_id',$order->shop_id)->where('type',1)->where('current_number','>',0)->where('status',1)->max('tax_purchase_price');
                            if($amount < $max){
                                return Lang::get("scs_error.data_price_error_61018");
                            }
                        }
                        $opns->amount=$amount;
                    }
                    $new_moo=new MaintenanceOutOrder;
                    $new_moo->shop_id=$order->shop_id;
                    $new_moo->status=0;
                    $new_moo->type=$opns->type;
                    $new_moo->item_id=$opns->item_id;
                    $new_moo->product_type="non_standard";
                    $new_moo->product_item_id=$opns->id;
                    $new_moo->order_id=$order->order_id;
                    $new_moo->number=$temp_num;
                    $new_moo->save();
                }else{///如果是数量减少判断 出库数量 减去退库数量  如果 修改数量小于 出库数量减去退库数量 则 不允许修改  要退库在修改
                    //如果 是数量不变则不判断
                    if($temp_op_amount!=$amount){//非标耗材的时候价格因素起作用                如果修改价格     
                        
                        if($opns->type==0&&PriceBargaining::ischange($opns->item_id,$order->shop_id)==0){//如果标准耗材且 不能改价格的 该判断
                            return Lang::get("scs_error.order_price_error_400137");
                        }else{
                            $max=0;
                            $ids=MaintenanceOutOrder::where("product_type","non_standard")->where("product_item_id",$opns->id)->where("status",2)->select("id")->get();
                            foreach ($ids as $_ids) {
                                $temp_max=DB::select("select max(tax_purchase_price) as max from  maintenance_out_item where number>return_numer and order_out_id=?",array($_ids->id));
                                $max=$max<$temp_max[0]->max?$temp_max[0]->max:$max;
                            }
                            if($amount < $max){
                                return Lang::get("scs_error.data_price_error_61018");
                            }
                        }
                        $opns->amount=$amount;
                    }
                    if($temp_num<0){
                        $cro_num=MaintenanceReturnOrder::where("product_type","non_standard")->where("product_item_id",$opns->id)->where("status",1)->sum("number");//退库数量
                        $coo_num=MaintenanceOutOrder::where("product_type","non_standard")->where("product_item_id",$opns->id)->where("status",2)->sum("number");//出库数量
                        if($coo_num-$cro_num>$number){// 出库数量 -退库数量 大于等 修改树龄
                            return Lang::get("scs_error.order_product_item_change_error_40014");
                        }
                    }                    
                }
            }else{//如果不存在已经领料的  就是 该耗材项  没申请过领料 或者 是 申请领料 都已退货 都已删除 该种情况随意修改耗材数量
                if($temp_op_amount!=$amount){//非标耗材的时候价格因素起作用                     
                    if($opns->type==0&&PriceBargaining::ischange($opns->item_id,$order->shop_id)==0){//如果标准耗材且 不能改价格的 该判断
                        return Lang::get("scs_error.order_price_error_400137");
                    }else{
                        $max=MaintenanceStorageItem::where('item_id',$opns->item_id)->where('shop_id',$order->shop_id)->where('type',1)->where('current_number','>',0)->where('status',1)->max('tax_purchase_price');
                        if($amount < $max){
                            return Lang::get("scs_error.data_price_error_61018");
                        }
                    }
                    $opns->amount=$amount;
                }
            }
            $opr=new OrderProductRecord();
            $opr->order_id=$order->order_id;
            $opr->product_type='non_standard';
            $opr->operation_type='update';
            $opr->num=$opns->num;
            $opr->operation_grade='二级';
            $opr->user_id=$sc_user_id;
            $opr->user_type='sc';
            $opr->operation_id=$opns->id;
            $opr->name=$opns->name;
            $opr->amount=$temp_op_amount;
            $opr->save();
            $opns->num=$number;
            $opns->save();
            
            //订单应付金额及优惠信息将重新计算，废弃原有再优惠信息上加减
            Orders::calculate($order_id);
            Coupons::check_coupons($order_id);
            return array('code' => 0, 'msg' => 'ok', 'result' => array("order_id"=>$order_id));
        });
    }



    /**
     * @Author:      lyt
     * @DateTime:    2016-01-29 14:58:51
     * @Description: 订单添加 非标的基本耗材
     */
    public static function saveBaseItem($si,$order_id,$sc_user_id,$wmcf,$number){
        return DB::transaction(function () use ($si,$order_id,$sc_user_id,$wmcf,$number){
            $order=Orders::find($order_id);
            $ss=SupplySeries::find($si->series_id);
            $temp_amount=$si->amount*$wmcf->supply_coefficient;
            $temp_amount=Common::upFow($temp_amount);
            $op=new OrderProduct;
            $op->order_id=$order->order_id;
            $op->product_type='non_standard';
            $op->product_id=$si->id;
            $op->product_name=$ss->name." ".$si->model;
            $op->amount=$temp_amount*$number;
            $op->status=1;
            $op->save();
            $opns=new OrderProductNonStandard;
            $opns->order_id=$order->order_id;
            $opns->name=$ss->name." ".$si->model;
            $opns->num=$number;
            $opns->amount=$temp_amount;
            $opns->order_product_id=$op->id;
            $opns->work_station=0;
            $opns->work_status="prepare";
            $opns->type=0;
            $opns->save();
            $opr=new OrderProductRecord();
            $opr->order_id=$order->order_id;
            $opr->product_type='non_standard';
            $opr->operation_type='create';
            $opr->num=1;
            $opr->operation_grade='一级';
            $opr->user_id=$sc_user_id;
            $opr->user_type='sc';
            $opr->operation_id=$op->id;
            $opr->name=$opns->name;
            $opr->amount=$opns->amount;
            $opr->save();

            $order->amount=$order->amount+($temp_amount*$number);
            $order->balance_amount=$order->balance_amount+($temp_amount*$number);
            $order->save();
            return array('code' => 0, 'msg' => 'ok', 'result' => array("order_id"=>$order->order_id,"order_product_amount"=>$op->amount,"order_amount"=>$order->amount));
        });
    }

}